package cn.tedu.content.service.impl;

import ch.qos.logback.core.joran.util.beans.BeanUtil;
import cn.tedu.content.dao.persist.mapper.repository.CategoryRepository;
import cn.tedu.content.pojo.bo.CategoryBO;
import cn.tedu.content.pojo.param.CategoryAddParam;
import cn.tedu.content.pojo.po.CategoryPO;
import cn.tedu.content.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    CategoryRepository categoryRepository;

    @Override
    public List<CategoryBO> listCategory() {
        //先得到PO
        List<CategoryPO> list = categoryRepository.list();
        //把PO转换为BO
        List<CategoryBO> result = new ArrayList<>();
        for (CategoryPO categoryPO : list){
            CategoryBO categoryBO = new CategoryBO();
            BeanUtils.copyProperties(categoryPO,categoryBO);
            result.add(categoryBO);
        }
        return result;
    }

    @Override
    public void addCategory(CategoryAddParam categoryAddParam) {
        log.debug("开始处理增加类别,参数:{}",categoryAddParam);
        //判断 去数据库查一下,通过类别名称这个类别名称
        String name = categoryAddParam.getName();
        int count =categoryRepository.countByName(name);
        log.debug("根据列表名称{}统计数量,结果:{}",name,count);
        //存在 抛出异常
         if (count > 0){
             String Message = "插入失败，这个类别已经存在";
             log.error(Message);
             throw new RuntimeException(Message);
         }else{
             // 不存在 插入数据
             // 判断下这个新插入的类别是子类别还是父类别
             Long parentId = categoryAddParam.getParentId();

             if (parentId == 0){
                 //父类别
                 log.debug("新增类别的parentId{},为父类别",parentId);
                 //插入的方法时候需要返回结果,要结合业务是返回影响行数还是id
                 //todo 去看mybaits 插入数据怎么返回id

               int rows =  categoryRepository.addNew(categoryAddParam);
               log.debug("新增类别入参:{},影响行数{}",categoryAddParam,rows);
             } else {
                 //是子类别
                 //   看他的父类别是谁?
                 CategoryPO categoryPO =
                         categoryRepository.getCategoryByParentId(parentId);
                 log.debug("根据parentId{}查询父类类别结果{}",parentId,categoryPO);
                 //      父类别是否存在
                 if (categoryPO != null){
                     //存在 插入
                     categoryRepository.addNew(categoryAddParam);
                 }else {
                     //不存在 抛异常
                     throw new RuntimeException("插入失败,父类别不存在");
                 }


             }
         }




        //1 类别名称必须唯一
        // 我们要判断 去数据库查一下,通过类别名称这个类别名称
        // 是否在数据库存在这个类别名称?
        //   存在 抛出异常
        //   不存在 插入数据
        //2 判断下这个新插入的类别是子类别还是父类别
        //   是子类别
        //   看他的父类别是谁?
        //      父类别是否存在
        //          存在 插入
        //          不存在 抛异常
        //    是父类别
        //      直接插入
        // 1 家电  0   1
        // 2 电视  1   1
        // 3 冰箱  1   1
        // 4 4k电视 2   0
        // 5 双开门冰箱 3  0
        // 我只查询 子类  电视和冰箱  parent_id != 0
        // 我只查询 子类  4k电视   parent_id != 2
        // 我只查询  最下面那层  parent_id > 1  --> is_parent = 0
    }
}
